package com.dom.invoapp.util;

import java.math.BigDecimal;

/**
 * 商品计算工具类
 */
public class ComputeUtil {

    /**
     * 计算不含税价格
     * （四舍五入保留小数点后两位）
     * 公式：价格-价格/(1+销项税率)*销项税率
     * @param price
     * @param rate
     * @return
     */
    public static BigDecimal computeNoTaxPrice(BigDecimal price, BigDecimal rate){
        return price.subtract(price.divide(BigDecimal.ONE.add(rate),2,BigDecimal.ROUND_HALF_UP).multiply(rate)).setScale(2,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算不含税价格
     * （四舍五入保留小数点后两位）
     * 公式：价格-价格/(1+销项税率)*销项税率
     * @param price
     * @param rate
     * @return
     */
    public static BigDecimal computeNoTaxPrice(String price, String rate){
        BigDecimal priceBig = new BigDecimal(price);
        BigDecimal rateBig = new BigDecimal(rate);
        return computeNoTaxPrice(rateBig,rateBig);
    }

    /**
     * 计算商品销项税
     * 公式：价格/(1+销项税率)*销项税率*数量
     * @param price
     * @param rate
     * @param amount
     * @return
     */
    public static BigDecimal computeEstOutTax(BigDecimal price, BigDecimal rate, BigDecimal amount){
        return price.divide(BigDecimal.ONE.add(rate),2,BigDecimal.ROUND_HALF_UP).multiply(rate).multiply(amount).setScale(2,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算商品销项税
     * 公式：价格/(1+销项税率)*销项税率*数量
     * @param price
     * @param rate
     * @param amount
     * @return
     */
    public static BigDecimal computeEstOutTax(String price, String rate,String amount){
        BigDecimal p = new BigDecimal(price);
        BigDecimal r = new BigDecimal(rate);
        BigDecimal c = new BigDecimal(amount);
        return computeEstOutTax(p,r,c);
    }

    /**
     * 计算商品金额
     * 计算公式：商品价格*商品数量
     * @param price
     * @param count
     * @return
     */
    public static BigDecimal computeGoodsBal(BigDecimal price, BigDecimal count){
        return price.multiply(count);
    }

    /**
     * 计算商品金额
     * 计算公式：商品价格*商品数量
     * @param price
     * @param count
     * @return
     */
    public static BigDecimal computeGoodsBal(String price, String count){
        BigDecimal priceBig = new BigDecimal(price);
        BigDecimal countBig = new BigDecimal(count);
        return computeGoodsBal(priceBig,countBig);
    }

    /**
     * 计算商品不含税金额
     * 计算公式：商品不含税价格*商品数量
     * @param noTaxPrice
     * @param count
     * @return
     */
    public static BigDecimal computeGoodsNoTaxBal(BigDecimal noTaxPrice, BigDecimal count){
        return noTaxPrice.multiply(count);
    }

    /**
     * 计算商品不含税金额
     * 计算公式：商品不含税价格*商品数量
     * @param noTaxPrice
     * @param count
     * @return
     */
    public static BigDecimal computeGoodsNoTaxBal(BigDecimal noTaxPrice, String count){
        BigDecimal countBig = new BigDecimal(count);
        return computeGoodsNoTaxBal(noTaxPrice,countBig);
    }

    /**
     * 计算商品不含税金额
     * 公式：(价格-价格/(1+销项税率)*销项税率)*商品数量
     * @param price
     * @param count
     * @param rate
     * @return
     */
    public static BigDecimal computeGoodsNoTaxBal(BigDecimal price, BigDecimal count, BigDecimal rate){
        return computeGoodsNoTaxBal(computeNoTaxPrice(price,count),count);
    }

    /**
     * 计算商品不含税金额
     * 公式：(价格-价格/(1+销项税率)*销项税率)*商品数量
     * @param price
     * @param count
     * @param rate
     * @return
     */
    public static BigDecimal computeGoodsNoTaxBal(String price, String count, String rate){
        return computeGoodsNoTaxBal(computeNoTaxPrice(price,count),count);
    }

}
